package pe.tnova.generic.structure.project.springmvc.generic;

import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.JavaModelException;

import pe.tnova.generic.structure.project.springmvc.UI.OptionAtributoBean;
import pe.tnova.generic.structure.project.springmvc.UI.OptionEntidadBean;
import pe.tnova.generic.structure.project.springmvc.soruce.SourceProjectCore;
import pe.tnova.generic.structure.project.springmvc.util.ConstantesTNOVA;
import pe.tnova.generic.structure.project.springmvc.util.PluginUtil;

public class GenerarCapaDAOBase {
	private static final Logger LOG = Logger.getLogger(GenerarCapaDAO.class.getName());

	private OptionEntidadBean optionEntidadBean;
	private String strPackageBase, strCBO, strOrderBy;
	private IPackageFragment packBase;
	private IPackageFragment packBaseImpl;

	public GenerarCapaDAOBase(SourceProjectCore sourceProjectCore, OptionEntidadBean optionEntidadBean, String strPackageBase, IPackageFragment packBase, IPackageFragment packBaseImpl) {
		this.optionEntidadBean = optionEntidadBean;
		this.strPackageBase = strPackageBase;
		this.packBase = packBase;
		this.packBaseImpl = packBaseImpl;
		LOG.log(Level.INFO, "Generacion de codigo fuente DAO BASE para " + optionEntidadBean.getNombreEntidad() + " DAO:" + optionEntidadBean.isCheckGeneraCodigoDAO() + " DAOBASE:" + optionEntidadBean.isCheckGeneraCodigoDAOBASE() + " SERVICE:" + optionEntidadBean.isCheckGeneraCodigoSERVICE());
	}

	public void startGeneric() throws JavaModelException {
		LOG.log(Level.INFO, "Start Analisis generico " + optionEntidadBean.getNombreEntidad());
		if (optionEntidadBean.isCheckGeneraCodigoDAOBASE()) {
			strCBO = "CAMPO_" + optionEntidadBean.getValueCBO().toUpperCase();
			strOrderBy = "CAMPO_" + optionEntidadBean.getValueOrerBy().toUpperCase();
			ICompilationUnit interfazDAOBase = packBase.createCompilationUnit(optionEntidadBean.getNombreEntidad() + ConstantesTNOVA.CLASS_DAO_BASE + ConstantesTNOVA.EXTENSION_JAVA, generarCodigoFuenteDAOBase(optionEntidadBean.getNombreEntidad(), strPackageBase + ConstantesTNOVA.DONT + ConstantesTNOVA.PACK_DAO_BASE), true, null);
			interfazDAOBase.close();
			ICompilationUnit calseDAOBaseImpl = packBaseImpl.createCompilationUnit(optionEntidadBean.getNombreEntidad() + ConstantesTNOVA.CLASS_DAO_BASE_IMPL + ConstantesTNOVA.EXTENSION_JAVA, generarCodigoFuenteDAOBaseImpl(optionEntidadBean.getNombreEntidad(), strPackageBase + ConstantesTNOVA.DONT + ConstantesTNOVA.PACK_DAO_BASE_IMPL), true, null);
			calseDAOBaseImpl.close();
		}
	}

	private String generarCodigoFuenteDAOBase(String nombreEntidad, String strRuta) {
		StringBuilder buffer = new StringBuilder();
		buffer.append("package " + strRuta + ";");
		buffer.append(ConstantesTNOVA.EN);
		buffer.append("import java.util.Date;" + ConstantesTNOVA.EN);
		buffer.append("import java.util.List;" + ConstantesTNOVA.EN);
		buffer.append("import pe.tnova.library.util.Exception.SQLExceptionDAO;" + ConstantesTNOVA.EN);
		// buffer.append(generarImportEntidadDependientes() +
		// ConstantesTNOVA.EN);
		buffer.append("import pe.tnova.core.db.DAOUtil;" + ConstantesTNOVA.EN);
		buffer.append("import pe.tnova.core.db.JoinEntidad;" + ConstantesTNOVA.EN);
		buffer.append("import " + strPackageBase + ConstantesTNOVA.DONT + ConstantesTNOVA.PACK_DOMINIO + ConstantesTNOVA.DONT + nombreEntidad + ";" + ConstantesTNOVA.EN);
		buffer.append("import " + strPackageBase + ConstantesTNOVA.DONT + ConstantesTNOVA.PACK_DAO_BASE_IMPL + ConstantesTNOVA.DONT + nombreEntidad + ConstantesTNOVA.CLASS_DAO_BASE_IMPL + ConstantesTNOVA.DONT + nombreEntidad + ConstantesTNOVA.CLASS_DAO_BASE_UTIL + ";" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.EN);
		buffer.append("public interface " + nombreEntidad + ConstantesTNOVA.CLASS_DAO_BASE + "{\n");
		buffer.append(ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "public static final String STR_ENTIDAD = \"" + nombreEntidad + "\";" + ConstantesTNOVA.EN);
		buffer.append(adjuntarCamposEntidad() + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "public static final String SQL_QUERY = DAOUtil.SQL_SELECT + DAOUtil.SQL_SE + DAOUtil.SQL_FROM + STR_ENTIDAD + DAOUtil.SQL_SE;" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "public static final String SQL_QUERY_COUNT = DAOUtil.SQL_SELECT + DAOUtil.SQL_COUNT + \"(\" + DAOUtil.SQL_SE + \")\" + DAOUtil.SQL_FROM + STR_ENTIDAD + DAOUtil.SQL_SE;" + ConstantesTNOVA.EN);
		buffer.append(adjuntarQuerysPorConstrucctores() + ConstantesTNOVA.EN);
		buffer.append(adjuntarQuerysCBO() + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + asignarDocumentacion("") + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "public int countLista" + nombreEntidad + "( " + nombreEntidad + " filtro ) throws SQLExceptionDAO;" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "public int countLista" + nombreEntidad + "( " + nombreEntidad + " filtro, Date finit, Date ffin ) throws SQLExceptionDAO;" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "public List<" + nombreEntidad + "> getLista" + nombreEntidad + "( " + nombreEntidad + " filtro, int inicio, int fin, String strSort, String strOrder, JoinEntidad... innerjoin ) throws SQLExceptionDAO;" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "public List<" + nombreEntidad + "> getLista" + nombreEntidad + "( " + nombreEntidad + " filtro, Date finit, Date ffin, int inicio, int fin, String strSort, String strOrder, JoinEntidad... innerjoin ) throws SQLExceptionDAO;" + ConstantesTNOVA.EN);
		buffer.append(adjuntarMetodosPorContructores(nombreEntidad) + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "public List<" + nombreEntidad + "> getCbo" + nombreEntidad + "() throws SQLExceptionDAO;" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "public List<" + nombreEntidad + "> getCbo" + nombreEntidad + "( " + nombreEntidad + " filtro ) throws SQLExceptionDAO;" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "public List<" + nombreEntidad + "> get" + nombreEntidad + "PorID" + "( Integer[] ids , String tipo , JoinEntidad innerjoin ) throws SQLExceptionDAO;" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "public " + nombreEntidad + ConstantesTNOVA.CLASS_DAO_BASE_UTIL + " setQuery();" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.EN);
		buffer.append("}" + ConstantesTNOVA.EN);
		return buffer.toString();
	}

	private String asignarDocumentacion(String string) {

		return "";
	}

	private String adjuntarQuerysCBO() {
		StringBuilder buffer = new StringBuilder();
		buffer.append(ConstantesTNOVA.ET + "public static final String SQL_QUERY_CBO =   DAOUtil.SQL_SELECT + DAOUtil.SQL_SEA + CAMPO_ID + \",\" + DAOUtil.SQL_SEA + " + strCBO + " + DAOUtil.SQL_FROM + STR_ENTIDAD + DAOUtil.SQL_SE;");
		return buffer.toString();
	}

	private String adjuntarMetodosPorContructores(String entidad) {
		StringBuilder buffer = new StringBuilder();
		Map<String, List<String>> optionConstructor = optionEntidadBean.getLstNombreCamposConstructores();
		List<String> listStrings = null;
		for (Entry<String, List<String>> entry : optionConstructor.entrySet()) {
			buffer.append(ConstantesTNOVA.ET + "public List<" + entidad + "> get" + entidad);
			listStrings = entry.getValue();
			for (String string : listStrings) {
				buffer.append("Por" + PluginUtil.capitalizarPrimerCaracter(string.toLowerCase()));
			}
			buffer.append("(" + entidad + " filtro, int inicio, int fin, String strSort, String strOrder, JoinEntidad... innerjoin) throws SQLExceptionDAO;");
			buffer.append(ConstantesTNOVA.EN);
		}
		for (Entry<String, List<String>> entry : optionConstructor.entrySet()) {
			buffer.append(ConstantesTNOVA.ET + "public List<" + entidad + "> get" + entidad);
			listStrings = entry.getValue();
			for (String string : listStrings) {
				buffer.append("Por" + PluginUtil.capitalizarPrimerCaracter(string.toLowerCase()));
			}
			buffer.append("(" + entidad + " filtro, Date finit, Date ffin, int inicio, int fin, String strSort, String strOrder, JoinEntidad... innerjoin) throws SQLExceptionDAO;");
			buffer.append(ConstantesTNOVA.EN);
		}
		return buffer.toString();
	}

	private String adjuntarQuerysPorConstrucctores() {
		StringBuilder buffer = new StringBuilder();
		Map<String, Object> optionConstructor = optionEntidadBean.getLstConstructores();
		for (Entry<String, Object> entry : optionConstructor.entrySet()) {
			buffer.append(ConstantesTNOVA.ET + "public static final String " + entry.getKey() + ConstantesTNOVA.IGUAL + entry.getValue() + ";" + ConstantesTNOVA.EN);
		}
		return buffer.toString();
	}

	private String adjuntarCamposEntidad() {
		StringBuilder buffer = new StringBuilder();
		List<OptionAtributoBean> otionsAbributos = optionEntidadBean.getLstCampoAtributoBeans();
		for (OptionAtributoBean optionAtributoBean : otionsAbributos) {
			buffer.append(ConstantesTNOVA.ET + "public static final String " + optionAtributoBean.getKey() + ConstantesTNOVA.IGUAL + " \"" + optionAtributoBean.getValue() + "\";" + ConstantesTNOVA.EN);
		}
		return buffer.toString();
	}

	private String generarImportEntidadDependientes() {
		StringBuilder buffer = new StringBuilder();
		for (String imports : optionEntidadBean.getLstImportsAdicionasPorAtributosEntidad()) {
			buffer.append(imports + ConstantesTNOVA.EN);
		}
		return buffer.toString();
	}

	private String generarCodigoFuenteDAOBaseImpl(String nameEntidad, String strRuta) {
		StringBuilder buffer = new StringBuilder();
		buffer.append("package " + strRuta + ";");
		buffer.append(ConstantesTNOVA.EN);
		buffer.append("import pe.tnova.core.db.DAOUtil;" + ConstantesTNOVA.EN);
		buffer.append("import pe.tnova.core.db.JoinEntidad;" + ConstantesTNOVA.EN);
		buffer.append("import org.slf4j.Logger;" + ConstantesTNOVA.EN);
		buffer.append("import java.util.Arrays;" + ConstantesTNOVA.EN);
		buffer.append("import java.util.List;" + ConstantesTNOVA.EN);
		buffer.append("import java.util.Date;" + ConstantesTNOVA.EN);
		buffer.append("import javax.persistence.Query;" + ConstantesTNOVA.EN);
		buffer.append("import javax.persistence.EntityManager;" + ConstantesTNOVA.EN);
		buffer.append("import pe.tnova.library.util.CharPoolUtil;" + ConstantesTNOVA.EN);
		buffer.append("import pe.tnova.library.util.Util;" + ConstantesTNOVA.EN);
		buffer.append("import pe.tnova.library.util.Exception.SQLExceptionDAO;" + ConstantesTNOVA.EN);
		buffer.append("import pe.tnova.library.util.validate.ValidateUtil;" + ConstantesTNOVA.EN);
		buffer.append(generarImportEntidadDependientes() + ConstantesTNOVA.EN);
		buffer.append("import org.slf4j.LoggerFactory;" + ConstantesTNOVA.EN);
		buffer.append("import " + strPackageBase + ConstantesTNOVA.DONT + ConstantesTNOVA.PACK_DAO_BASE + ConstantesTNOVA.DONT + nameEntidad + ConstantesTNOVA.CLASS_DAO_BASE + ";" + ConstantesTNOVA.EN);
		buffer.append("import " + strPackageBase + ConstantesTNOVA.DONT + ConstantesTNOVA.PACK_DOMINIO + ConstantesTNOVA.DONT + nameEntidad + ";" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.EN);
		buffer.append("public class " + nameEntidad + ConstantesTNOVA.CLASS_DAO_BASE_IMPL + " implements " + nameEntidad + ConstantesTNOVA.CLASS_DAO_BASE + " {\n");
		buffer.append(ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "private static final Logger logger = LoggerFactory.getLogger(" + nameEntidad + ConstantesTNOVA.CLASS_DAO_BASE_IMPL + ".class);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "private EntityManager entityManager = null;" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "private Query qy = null;" + ConstantesTNOVA.EN);

		buffer.append(ConstantesTNOVA.ET + "public " + nameEntidad + ConstantesTNOVA.CLASS_DAO_BASE_IMPL + "(EntityManager entityManager) {" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "	this.entityManager = entityManager;" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "}" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "public int countLista" + nameEntidad + "( " + nameEntidad + " filtro ) throws SQLExceptionDAO {" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "int count = 0;" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "StringBuffer strbfSqlQuery = new StringBuffer();" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "strbfSqlQuery.append(SQL_QUERY_COUNT);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "procesarConsulta(filtro, strbfSqlQuery);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "count = (Integer) qy.getSingleResult();" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "return count;" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "}" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "public int countLista" + nameEntidad + "( " + nameEntidad + " filtro, Date finit, Date ffin ) throws SQLExceptionDAO{" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "int count = 0;" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "StringBuffer strbfSqlQuery = new StringBuffer();" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "strbfSqlQuery.append(SQL_QUERY_COUNT);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "procesarConsulta(filtro, finit, ffin, strbfSqlQuery);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "count = (Integer) qy.getSingleResult();" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "return count;" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "}" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "@SuppressWarnings(\"unchecked\")" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "public List<" + nameEntidad + "> getLista" + nameEntidad + "( " + nameEntidad + " filtro, int inicio, int fin, String strSort, String strOrder, JoinEntidad... innerjoin ) throws SQLExceptionDAO {" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "StringBuffer strbfSqlQuery = new StringBuffer();" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "strbfSqlQuery.append(SQL_QUERY);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "procesarConsulta(filtro, strbfSqlQuery, innerjoin);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "DAOUtil.setPaginador(qy, inicio, fin);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "DAOUtil.setOrder(strbfSqlQuery, strSort, strOrder);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "List<" + nameEntidad + "> p = qy.getResultList();" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "return p;" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "}" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "@SuppressWarnings(\"unchecked\")" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "public List<" + nameEntidad + "> getLista" + nameEntidad + "( " + nameEntidad + " filtro, Date finit, Date ffin, int inicio, int fin, String strSort, String strOrder, JoinEntidad... innerjoin ) throws SQLExceptionDAO {" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "StringBuffer strbfSqlQuery = new StringBuffer();" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "strbfSqlQuery.append(SQL_QUERY);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "procesarConsulta(filtro, finit, ffin, strbfSqlQuery, innerjoin);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "DAOUtil.setPaginador(qy, inicio, fin);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "DAOUtil.setOrder(strbfSqlQuery, strSort, strOrder);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "List<" + nameEntidad + "> p = qy.getResultList();" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "return p;" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "}" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.EN);
		buffer.append(adjuntarMetodosPorContructoresImpl(nameEntidad));
		buffer.append(ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "@SuppressWarnings(\"unchecked\")" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "public List<" + nameEntidad + "> getCbo" + nameEntidad + "() throws SQLExceptionDAO{" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "StringBuffer strbfSqlQuery = new StringBuffer();" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "strbfSqlQuery.append(SQL_QUERY_CBO);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + nameEntidad + " filt = new " + nameEntidad + "();" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "filt.setActivo(true);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "procesarConsulta(filt, strbfSqlQuery);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "DAOUtil.setOrder(strbfSqlQuery, " + strOrderBy + ", DAOUtil.SQL_ASC);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "List<" + nameEntidad + "> p = qy.getResultList();" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "return p;" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "}" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "@SuppressWarnings(\"unchecked\")" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "public List<" + nameEntidad + "> getCbo" + nameEntidad + "( " + nameEntidad + " filtro ) throws SQLExceptionDAO {" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "StringBuffer strbfSqlQuery = new StringBuffer();" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "strbfSqlQuery.append(SQL_QUERY_CBO);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "procesarConsulta(filtro, strbfSqlQuery);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "DAOUtil.setOrder(strbfSqlQuery, " + strOrderBy + ", DAOUtil.SQL_ASC);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "List<" + nameEntidad + "> p = qy.getResultList();" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "return p;" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "}" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "@SuppressWarnings(\"unchecked\")" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "public List<" + nameEntidad + "> get" + nameEntidad + "PorID" + "( Integer[] ids , String tipo , JoinEntidad innerjoin ) throws SQLExceptionDAO {" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "StringBuffer strbfSqlQuery = new StringBuffer();" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "if (tipo.equals(DAOUtil.LISTA_LIMItADA_CBO)) {" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "	strbfSqlQuery.append(SQL_QUERY_CBO);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "} else if (tipo.equals(DAOUtil.LISTA_COMPLETA)) {" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "	strbfSqlQuery.append(SQL_QUERY);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "}" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + nameEntidad + " filt = new " + nameEntidad + "();" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "filt.setActivo(true);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "procesarConsulta(filt, ids, strbfSqlQuery, innerjoin);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "DAOUtil.setOrder(strbfSqlQuery, " + strOrderBy + ", DAOUtil.SQL_ASC);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "List<" + nameEntidad + "> p = qy.getResultList();" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "return p;" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "}" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.EN);
		buffer.append(adjuntarMetodosImplPorContructores(nameEntidad));
		buffer.append(adjuntarMetodosAsignacion(nameEntidad));
		buffer.append(ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "public " + nameEntidad + ConstantesTNOVA.CLASS_DAO_BASE_UTIL + " setQuery() {" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "return new " + nameEntidad + ConstantesTNOVA.CLASS_DAO_BASE_UTIL + "();" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "}" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.EN);
		buffer.append(generarInterEntidadUtil(nameEntidad));
		buffer.append(ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "private EntityManager getEntityManager() {" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + " return entityManager;" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "}" + ConstantesTNOVA.EN);
		buffer.append("}" + ConstantesTNOVA.EN);
		return buffer.toString();
	}

	private String adjuntarMetodosPorContructoresImpl(String entidad) {
		StringBuilder buffer = new StringBuilder();
		System.out.println("optionEntidadBean");
		System.out.println(optionEntidadBean);
		Map<String, List<String>> optionConstructor = optionEntidadBean.getLstNombreCamposConstructores();
		List<String> listStrings = null;
		for (Entry<String, List<String>> entry : optionConstructor.entrySet()) {
			buffer.append(ConstantesTNOVA.ET + "@SuppressWarnings(\"unchecked\")" + ConstantesTNOVA.EN);
			buffer.append(ConstantesTNOVA.ET + "public List<" + entidad + "> get" + entidad);
			listStrings = entry.getValue();
			for (String string : listStrings) {
				buffer.append("Por" + PluginUtil.capitalizarPrimerCaracter(string.toLowerCase()));
			}
			buffer.append("(" + entidad + " filtro, int inicio, int fin, String strSort, String strOrder, JoinEntidad... innerjoin) throws SQLExceptionDAO{" + ConstantesTNOVA.EN);
			buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "StringBuffer strbfSqlQuery = new StringBuffer();" + ConstantesTNOVA.EN);
			buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "strbfSqlQuery.append(" + entry.getKey() + ");" + ConstantesTNOVA.EN);
			buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "procesarConsulta(filtro, strbfSqlQuery, innerjoin);" + ConstantesTNOVA.EN);
			buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "DAOUtil.setPaginador(qy, inicio, fin);" + ConstantesTNOVA.EN);
			buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "DAOUtil.setOrder(strbfSqlQuery, strSort, strOrder);" + ConstantesTNOVA.EN);
			buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "List<" + entidad + "> p = qy.getResultList();" + ConstantesTNOVA.EN);
			buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "return p;" + ConstantesTNOVA.EN);
			buffer.append(ConstantesTNOVA.ET + "}");
			buffer.append(ConstantesTNOVA.EN);
		}
		for (Entry<String, List<String>> entry : optionConstructor.entrySet()) {
			buffer.append(ConstantesTNOVA.ET + "@SuppressWarnings(\"unchecked\")" + ConstantesTNOVA.EN);
			buffer.append(ConstantesTNOVA.ET + "public List<" + entidad + "> get" + entidad);
			listStrings = entry.getValue();
			for (String string : listStrings) {
				buffer.append("Por" + PluginUtil.capitalizarPrimerCaracter(string.toLowerCase()));
			}
			buffer.append("(" + entidad + " filtro, Date finit, Date ffin, int inicio, int fin, String strSort, String strOrder, JoinEntidad... innerjoin) throws SQLExceptionDAO{" + ConstantesTNOVA.EN);
			buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "StringBuffer strbfSqlQuery = new StringBuffer();" + ConstantesTNOVA.EN);
			buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "strbfSqlQuery.append(" + entry.getKey() + ");" + ConstantesTNOVA.EN);
			buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "procesarConsulta(filtro, finit, ffin,  strbfSqlQuery, innerjoin);" + ConstantesTNOVA.EN);
			buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "DAOUtil.setPaginador(qy, inicio, fin);" + ConstantesTNOVA.EN);
			buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "DAOUtil.setOrder(strbfSqlQuery, strSort, strOrder);" + ConstantesTNOVA.EN);
			buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "List<" + entidad + "> p = qy.getResultList();" + ConstantesTNOVA.EN);
			buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "return p;" + ConstantesTNOVA.EN);
			buffer.append(ConstantesTNOVA.ET + "}");
			buffer.append(ConstantesTNOVA.EN);
		}
		return buffer.toString();
	}

	private String adjuntarMetodosAsignacion(String nameEntidad) {
		StringBuilder buffer = new StringBuilder();

		buffer.append(ConstantesTNOVA.ET + "private void procesarConsulta(" + nameEntidad + " filtro, StringBuffer strbfSqlQuery, JoinEntidad... innerjoin) {" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "procesarConsulta(filtro, null, null, strbfSqlQuery, innerjoin);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "}" + ConstantesTNOVA.EN);

		buffer.append(ConstantesTNOVA.ET + " private void procesarConsulta(" + nameEntidad + " filtro, Date finit, Date ffin, StringBuffer strbfSqlQuery, JoinEntidad... innerjoin) {" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "if (ValidateUtil.isNotNull(filtro)) {" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "if (ValidateUtil.isNotNull(finit) || ValidateUtil.isNotNull(ffin)) {" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "setValues(filtro, finit, ffin, strbfSqlQuery, innerjoin);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "qy = getEntityManager().createQuery(strbfSqlQuery.toString());" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "setFiltroEntidad(filtro, finit, ffin, innerjoin);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "} else {" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "setValues(filtro, strbfSqlQuery, innerjoin);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "qy = getEntityManager().createQuery(strbfSqlQuery.toString());" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "setFiltroEntidad(filtro, innerjoin);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "}" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "}" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "if (logger.isDebugEnabled()) {" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "logger.debug(\"strbfSqlQuery:\" + strbfSqlQuery.toString());" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "}" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "}" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.EN);

		buffer.append(ConstantesTNOVA.ET + "private void procesarConsulta(" + nameEntidad + " objEntidad, Integer[] ids, StringBuffer strbfSqlQuery, JoinEntidad... innerjoin) {" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "setValues(objEntidad, ids, strbfSqlQuery, innerjoin); " + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "qy = getEntityManager().createQuery(strbfSqlQuery.toString());" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "setFiltroEntidad(objEntidad, ids, innerjoin); " + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "}" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.EN);

		buffer.append(ConstantesTNOVA.ET + "private void setValues(" + nameEntidad + " objEntidad, Integer[] ids, StringBuffer strbfSqlQuery, JoinEntidad... innerjoin) {" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "setValues(objEntidad, strbfSqlQuery, innerjoin);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "DAOUtil.establecerCondicionIN(strbfSqlQuery, (DAOUtil.SQL_SEA +  CAMPO_ID + DAOUtil.SQL_EQ + DAOUtil.SQL_FILTRO + CAMPO_ID), Arrays.asList(ids)); " + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "}" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.EN);

		buffer.append(ConstantesTNOVA.ET + "private void setValues(" + nameEntidad + " filtro, Date finit, Date ffin, StringBuffer strbfSqlQuery, JoinEntidad... innerjoin) {" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "DAOUtil.establecerCondicion(strbfSqlQuery, (DAOUtil.SQL_SEA + CAMPO_FECHAREGISTRO + DAOUtil.SQL_MENOS + DAOUtil.SQL_FILTRO + CAMPO_FECHAREGISTRO + DAOUtil.TOKEMN1 ), finit);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "DAOUtil.establecerCondicion(strbfSqlQuery, (DAOUtil.SQL_SEA + CAMPO_FECHAREGISTRO + DAOUtil.SQL_MAS + DAOUtil.SQL_FILTRO + CAMPO_FECHAREGISTRO + DAOUtil.TOKEMN2), ffin);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "setValues(filtro, strbfSqlQuery, innerjoin);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "}" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.EN);

		buffer.append(ConstantesTNOVA.ET + "private void setFiltroEntidad(" + nameEntidad + " filtro, Date finit, Date ffin, JoinEntidad... innerjoin) {;" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "DAOUtil.establecerParam(qy, CAMPO_FECHAREGISTRO + DAOUtil.TOKEMN1 , finit);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "DAOUtil.establecerParam(qy, CAMPO_FECHAREGISTRO + DAOUtil.TOKEMN2 , ffin);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "setFiltroEntidad(filtro, innerjoin);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "}" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.EN);

		buffer.append(ConstantesTNOVA.ET + "private void setFiltroEntidad(" + nameEntidad + " objEntidad, Integer[] ids, JoinEntidad... innerjoin) { " + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "DAOUtil.establecerParamIN(qy, CAMPO_ID, Arrays.asList(ids)); " + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "setFiltroEntidad(objEntidad, innerjoin); " + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "}" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.EN);

		return buffer.toString();
	}

	private String adjuntarMetodosImplPorContructores(String nameEntidad) {
		StringBuilder buffer = new StringBuilder();
		buffer.append(ConstantesTNOVA.ET + "private void setValues(" + nameEntidad + " filtro, StringBuffer strbfSqlQuery, JoinEntidad... innerjoin) {;" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "DAOUtil.establecerCondicionInnerJoins(strbfSqlQuery, innerjoin);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "Util.quitarUltimoAND(strbfSqlQuery, DAOUtil.SQL_AND);" + ConstantesTNOVA.EN);
		List<OptionAtributoBean> lstCampoAtributoBeans = optionEntidadBean.getLstCampoAtributoBeans();
		for (OptionAtributoBean optionAtributoBean : lstCampoAtributoBeans) {
			buffer.append(asignarCondicion(optionAtributoBean));
		}
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "if (logger.isDebugEnabled()) {" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "logger.debug(\"strbfSqlQuery:\" + strbfSqlQuery.toString());" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "}" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "}" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.EN);

		buffer.append(ConstantesTNOVA.ET + "private void setFiltroEntidad(" + nameEntidad + " filtro, JoinEntidad... innerjoin) {" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "DAOUtil.establecerInnerJoinsParam(qy, innerjoin);" + ConstantesTNOVA.EN);
		for (OptionAtributoBean optionAtributoBean : lstCampoAtributoBeans) {
			buffer.append(asignarFiltro(optionAtributoBean));
		}
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "if (logger.isDebugEnabled()) {" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "DAOUtil.printParameterQuery(qy);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "}" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "}" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.EN);
		return buffer.toString();
	}

	private String asignarFiltro(OptionAtributoBean optionAtributoBean) {
		StringBuilder buffer = new StringBuilder();
		String keyCampo = "", strTipoFiltro = "", strGetMetodo = "";
		keyCampo = optionAtributoBean.getKey();
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "DAOUtil.establecerParam(qy, " + keyCampo);
		strGetMetodo = PluginUtil.capitalizarPrimerCaracter(optionAtributoBean.getValue());
		buffer.append(", filtro.get" + strGetMetodo + "()");
		if (optionAtributoBean.getTipoJava().equals(ConstantesTNOVA.TYPE_ATRIBUTTE_STRING)) {
			strTipoFiltro = " , true, true ";
		} else {
			strTipoFiltro = "";
		}
		buffer.append(strTipoFiltro);
		buffer.append(");" + ConstantesTNOVA.EN);
		return buffer.toString();
	}

	private String asignarCondicion(OptionAtributoBean optionAtributoBean) {
		StringBuilder buffer = new StringBuilder();
		String keyCampo = "", strTipoFiltro = "", strGetMetodo = "";
		keyCampo = optionAtributoBean.getKey();
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "DAOUtil.establecerCondicion(strbfSqlQuery, (DAOUtil.SQL_SEA + " + keyCampo + " + ");
		if (optionAtributoBean.getTipoJava().equals(ConstantesTNOVA.TYPE_ATRIBUTTE_STRING)) {
			strTipoFiltro = " DAOUtil.SQL_LIKE ";
		} else {
			strTipoFiltro = " DAOUtil.SQL_EQ ";
		}
		strGetMetodo = PluginUtil.capitalizarPrimerCaracter(optionAtributoBean.getValue());
		buffer.append(strTipoFiltro + " + DAOUtil.SQL_FILTRO + " + keyCampo + "), filtro.get" + strGetMetodo + "()");
		buffer.append(");" + ConstantesTNOVA.EN);
		return buffer.toString();
	}

	private String generarInterEntidadUtil(String nameEntidad) {
		StringBuilder buffer = new StringBuilder();
		buffer.append(ConstantesTNOVA.ET + "public class " + nameEntidad + ConstantesTNOVA.CLASS_DAO_BASE_UTIL + "{" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "private StringBuffer strBuffer;" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "private " + nameEntidad + " filtro;" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "private Query query = null;" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "private Date frinit = null;" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "private Date frfin = null;" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "private Date fainit = null;" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "private Date fafin = null;" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "private void createBuffer() {" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "if (ValidateUtil.isNull(strBuffer)) {" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "strBuffer = new StringBuffer();" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "strBuffer.append(SQL_QUERY);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "filtro = new " + nameEntidad + "();" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "}" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "}" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.EN);
		buffer.append(generarSetAnidadosEntidad(nameEntidad + ConstantesTNOVA.CLASS_DAO_BASE_UTIL));
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "private void setFiltros() {" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "Util.quitarUltimoAND(strBuffer, DAOUtil.SQL_AND);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "if (logger.isDebugEnabled()){" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "logger.debug(\"strBuffer:\" + strBuffer.toString());" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "}" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "query = entityManager.createQuery(strBuffer.toString());" + ConstantesTNOVA.EN);
		buffer.append(adjuntarMetodosAnidados());			
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "DAOUtil.establecerParam(query, CAMPO_FECHAREGISTRO + DAOUtil.TOKEMN1, frinit);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "DAOUtil.establecerParam(query, CAMPO_FECHAREGISTRO + DAOUtil.TOKEMN2, frfin);" + ConstantesTNOVA.EN);	
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "DAOUtil.establecerParam(query, CAMPO_FECHAACTUALIZADA + DAOUtil.TOKEMN1, fainit);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "DAOUtil.establecerParam(query, CAMPO_FECHAACTUALIZADA + DAOUtil.TOKEMN2, fafin);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "if (logger.isDebugEnabled()){" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "DAOUtil.printParameterQuery(query);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "}" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "}" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.EN);
		
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "public " + nameEntidad + ConstantesTNOVA.CLASS_DAO_BASE_UTIL + " setFechaRegistro( Date  finit, Date  ffin ){" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "createBuffer();" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "DAOUtil.establecerCondicion(strBuffer, (DAOUtil.SQL_SEA + CAMPO_FECHAREGISTRO + DAOUtil.SQL_MENOS + DAOUtil.SQL_FILTRO + CAMPO_FECHAREGISTRO + DAOUtil.TOKEMN1), finit);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "DAOUtil.establecerCondicion(strBuffer, (DAOUtil.SQL_SEA + CAMPO_FECHAREGISTRO + DAOUtil.SQL_MAS + DAOUtil.SQL_FILTRO + CAMPO_FECHAREGISTRO + DAOUtil.TOKEMN2), ffin);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "this.frinit = finit;" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "this.frfin = ffin;" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "return this;" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "}" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "public " + nameEntidad + ConstantesTNOVA.CLASS_DAO_BASE_UTIL + " setFechaActualizada( Date  finit, Date  ffin ){" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "createBuffer();" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "DAOUtil.establecerCondicion(strBuffer, (DAOUtil.SQL_SEA + CAMPO_FECHAACTUALIZADA + DAOUtil.SQL_MENOS + DAOUtil.SQL_FILTRO + CAMPO_FECHAACTUALIZADA + DAOUtil.TOKEMN1), finit);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "DAOUtil.establecerCondicion(strBuffer, (DAOUtil.SQL_SEA + CAMPO_FECHAACTUALIZADA + DAOUtil.SQL_MAS + DAOUtil.SQL_FILTRO + CAMPO_FECHAACTUALIZADA + DAOUtil.TOKEMN2), ffin);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "this.fainit = finit;" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "this.fafin = ffin;" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET +"return this;" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET +"}" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.EN);	
		
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "@SuppressWarnings(\"unchecked\")" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "public List<" + nameEntidad + "> ejecutaFiltroFilas() throws SQLExceptionDAO {" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "setFiltros();" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "return query.getResultList();" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "}" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "@SuppressWarnings(\"unchecked\")" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "public List<" + nameEntidad + "> ejecutaFiltroFilas(int inicio, int fin, String strSort, String strOrder) throws SQLExceptionDAO {" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "setFiltros();" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "if ((inicio > -CharPoolUtil.NUMBER_0) && (fin > -CharPoolUtil.NUMBER_0)) {" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "query.setFirstResult(inicio);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "query.setMaxResults(fin);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "}" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "if (ValidateUtil.isNotNull(strSort) && ValidateUtil.isNotNull(strOrder)) {" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "DAOUtil.setOrder(strBuffer, strSort, strOrder);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "}" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "return query.getResultList();" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "}" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "public " + nameEntidad + " ejecutaFiltroPrimeraFila() throws SQLExceptionDAO {" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "setFiltros();" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "query.setFirstResult(1);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "query.setMaxResults(1);" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "return  (" + nameEntidad + ") query.getSingleResult();" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "}" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + "}" + ConstantesTNOVA.EN);
		return buffer.toString();
	}

	private String adjuntarMetodosAnidados() {
		StringBuilder buffer = new StringBuilder();
		List<OptionAtributoBean> lstCampoAtributoBeans = optionEntidadBean.getLstCampoAtributoBeans();
		for (OptionAtributoBean optionAtributoBean : lstCampoAtributoBeans) {
			buffer.append(asignarFiltroAnidado(optionAtributoBean) + ConstantesTNOVA.EN);
		}
		return buffer.toString();
	}

	private String generarSetAnidadosEntidad(String entidadDAOUtil) {
		StringBuilder buffer = new StringBuilder();
		List<OptionAtributoBean> lstCampoAtributoBeans = optionEntidadBean.getLstCampoAtributoBeans();
		for (OptionAtributoBean optionAtributoBean : lstCampoAtributoBeans) {
			buffer.append(asignarMetodoAnidado(entidadDAOUtil, optionAtributoBean));
		}
		return buffer.toString();
	}

	private String asignarFiltroAnidado(OptionAtributoBean optionAtributoBean) {
		StringBuilder buffer = new StringBuilder();
		String keyCampo = "", strTipoFiltro = "", strGetMetodo = "";
		keyCampo = optionAtributoBean.getKey();
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "DAOUtil.establecerParam(query, " + keyCampo);
		strGetMetodo = PluginUtil.capitalizarPrimerCaracter(optionAtributoBean.getValue());
		buffer.append(", filtro.get" + strGetMetodo + "()");
		if (optionAtributoBean.getTipoJava().equals(ConstantesTNOVA.TYPE_ATRIBUTTE_STRING)) {
			strTipoFiltro = " , true, true ";
		} else {
			strTipoFiltro = "";
		}
		buffer.append(strTipoFiltro);
		buffer.append(");");
		return buffer.toString();
	}

	private String asignarMetodoAnidado(String entidadDAOUtil, OptionAtributoBean optionAtributoBean) {
		StringBuilder buffer = new StringBuilder();
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "public " + entidadDAOUtil + " set" + PluginUtil.capitalizarPrimerCaracter(optionAtributoBean.getValue()) + "( " + optionAtributoBean.getTipoJava() + "  " + optionAtributoBean.getValue() + " ){" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "createBuffer();" + ConstantesTNOVA.EN);
		String keyCampo = "", strTipoFiltro = "";
		keyCampo = optionAtributoBean.getKey();
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "DAOUtil.establecerCondicion(strBuffer, (DAOUtil.SQL_SEA + " + keyCampo + " + ");
		if (optionAtributoBean.getTipoJava().equals(ConstantesTNOVA.TYPE_ATRIBUTTE_STRING)) {
			strTipoFiltro = " DAOUtil.SQL_LIKE ";
		} else {
			strTipoFiltro = " DAOUtil.SQL_EQ ";
		}
		buffer.append(strTipoFiltro + " + DAOUtil.SQL_FILTRO + " + keyCampo + "), " + optionAtributoBean.getValue() + ");" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "filtro.set" + PluginUtil.capitalizarPrimerCaracter(optionAtributoBean.getValue()) + "(" + optionAtributoBean.getValue() + ");" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + ConstantesTNOVA.ET + "return this;" + ConstantesTNOVA.EN);
		buffer.append(ConstantesTNOVA.ET + ConstantesTNOVA.ET + "}" + ConstantesTNOVA.EN);
		return buffer.toString();
	}

}
